import logging
import os

from document_file_tools import load_document_content, write_document_content_2_target_file
from document_format_tools import key_words_to_lower, key_words_to_upper
from replace_simple_table_name import rep_table_name_by_excel
from replace_simple_string import replace_simple_string_by_excel
from replace_complex_fn_main import replace_complex_main
from replace_simple_fn_main import replace_simple_main

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')

# 1.单文件处理，文件路径， 位于main同级目录下
source_file_path = os.getcwd() + "/{}_file.sql".format("source")
target_file_path = os.getcwd() + "/{}_file.sql".format("target")


def check_prompt_unsupported_content(document_content):
    """
    检查提示不支持的语法内容
    :param document_content:
    :return:
    """
    if "group_concat" in document_content or "GROUP_CONCAT" in document_content:
        logging.warning("""》》》》》 有发现未能正确处理的 GROUP_CONCAT 语句， 请注意调整
        **********
        GROUP_CONCAT 语句，可以使用 STRING_AGG() 函数替换
        **********
        """)

    if "GROUP BY" in document_content:
        logging.warning("""》》》》》 有发现 GRUOP BY 语句， 请注意调整
        **********
        GROUP BY 的字段，需要跟列表里面一致，其他字段 用聚合函数， 否则 要使用 max 或者 min 函数包起来
        **********
        """)

    if "HAVING" in document_content:
        logging.warning("""》》》》》 有发现 HAVING 语句， 请注意调整   
        ********** 
        HAVING 条件不支持表达式的别名
        ********** 
        """)

    if "INSERT OVERWRITE" in document_content:
        logging.warning(""" 》》》》》 有发现 INSERT OVERWRITE 语句， 请注意调整 """)

    if "REPLACE INTO" in document_content:
        logging.warning(""" 》》》》》 有发现 REPLACE INTO 语句， 请注意调整 格式参考
        **********
                    INSERT INTO [table name]
                    (
                      [column list]
                    )
                    SELECT
                      [column list]
                    FROM [table name] 
                    ON CONFLICT (primary key list)
                    DO UPDATE SET
                    (
                        column_name1
                    )=(
                        excluded.column_name1
                    );
        ********** """)


def main():
    """
    执行替换语句的主要函数入口，这里调用的其他替换规则
    读取文本内容
    将所有关键字转换成小写
    将已知的复杂表达式替换成对应的PG语法的
    将已知的简单表达式替换成对应的PG语法的
    将所有关键字转换成大写的
    :return: 。
    """
    # (1) 读取文档内容
    document_content = load_document_content(source_file_path)

    # (2) 关键字小写，主要是方便正则替换
    document_content = key_words_to_lower(document_content)

    # (3) 表名称替换
    document_content = rep_table_name_by_excel(document_content)

    # (4) 简单字符替换
    document_content = replace_simple_string_by_excel(document_content)

    # (5) 复杂函数替换
    document_content = replace_complex_main(document_content)

    # (6) 简单函数替换， 不包含嵌套格式的函数替换
    document_content = replace_simple_main(document_content)

    # (7) 关键字转换大写格式
    document_content = key_words_to_upper(document_content)

    # 将文档内容写出到目标文件中
    write_document_content_2_target_file(document_content, target_file_path)

    # 提示不支持的语法的
    check_prompt_unsupported_content(document_content)


if __name__ == "__main__":
    main()
